在重新創建活動或狀態進程後,您可以使用rememberSaveable 恢復狀態。rememberSaveable 在重組後保持狀態。另外,rememberSaveable 也可以在重新創建活動和進程後保持狀態。
存儲狀態的方式
添加到 Bundle 的所有數據類型自動保存。如果要保存無法添加到 Bundle 的內容,您有以下幾種選擇。
包裹
最簡單的解決方案是向對象@Parcelize註解狀態。將對象保存到可打包並且可以打包。例如,以下代碼會創建可解包其城市的數據類型。
@Parcelize
data class City(val name: String, val country: String) : Parcelable
@Composable
fun CityScreen() {
var selectedCity = rememberSaveable {
mutableStateOf(City("Madrid", "Spain"))
}
}
原因導致 @Parcelize 不合適,您可以使用 mapSaver 定義自己的捆綁包,如何規定將自己的對象轉換為系統可以Bundle 保存的如果值。
data class City(val name: String, val country: String)
val CitySaver = run {
val nameKey = "Name"
val countryKey = "Country"
mapSaver(
save = { mapOf(nameKey to it.name, countryKey to it.country) },
restore = { City(it[nameKey] as String, it[countryKey] as String) }
)
}
@Composable
fun CityScreen() {
var selectedCity = rememberSaveable(stateSaver = CitySaver) {
mutableStateOf(City("Madrid", "Spain"))
}
}
為了需要為映射定義,您也可以使用 listSaver 並避免其創建鍵:
ata class City(val name: String, val country: String)
val CitySaver = listSaver<City, Any>(
save = { listOf(it.name, it.country) },
restore = { City(it[0] as String, it[1] as String) }
)
@Composable
fun CityScreen() {
var selectedCity = rememberSaveable(stateSaver = CitySaver) {
mutableStateOf(City("Madrid", "Spain"))
}
}
您可以通過可自定義函數管理狀態的提升。但是,如果要跟踪狀態的數量增加,或者可組合函數中出現要執行的邏輯,簡單最好將邏輯和事務委員會派給其他類(狀態容器)。
本部分介紹瞭如何在 Compose 中以不同的方式管理管理狀態。根據可組合項目的複雜性,您需要考慮不同的工具方案:
可組合項:用於管理簡單的界面元素狀態。
包含:用於管理複雜的狀態界面元素,並具有狀態界面界面元素的狀態和邏輯。
架構視圖組件模型:一種特殊狀態的容器類型,用於提供對業務邏輯以及屏幕或界面狀態的訪問權限。
容器組件的狀態容器不等,可顯示範圍(從顯示內容到整個屏幕應用程序)的其他顯示範圍(顯示範圍),可將顯示內容的狀態容器顯示到容器中。狀態容器中,尤其是在匯總狀態時間。
下圖展示了 Compose 狀態管理所涉及的各個實體之間的關係概覽。本部分的其餘內容詳細介紹了每個實體:
組合組合可以依賴於一個或多個狀態容器(可以是的對象、視圖0或可正常具有的模型性質),具體說明復雜性。
如果的容器狀態需要訪問業務邏輯或普通屏幕狀態,則可能需要依賴於 ViewModel。
ViewModel 依賴於業務層或數據層。
Compose 狀態管理涉及的每個實體的(任選)依賴關係概覽。
狀態和邏輯的類型
在 Android 應用程序中,需要考慮不同類型的狀態:
界面元素是狀態界面元素的提升狀態。例如,ScaffoldState 處理 Scaffold 可組合項的狀態。
例如屏幕或界面狀態是屏幕上顯示需要消息的內容。,CartUiState 類可以包含購物車中的商品信息、向用戶的顯示或加載標記。該狀態通常會與顯示不同層次結構中的其他層相關聯,原因是其包含應用數據。
此外,邏輯還有不同的類型:
界面行為邏輯或界面邏輯與如何在屏幕上顯示狀態變化相關。例如,導航邏輯著下決定什麼,界面邏輯可能決定如何著裝信息顯示在控件上或用戶消息框的屏幕消息。界面行為自然應該在組合中。
業務邏輯決定處理狀態變化,例如如何付款或存儲層用戶偏好的業務設置。該邏輯通常位於或數據,但絕不會位於界面層。